package jmine.tec.utils.reflection.fast;

import java.lang.reflect.Method;

/**
 * Representa um metodo.
 * 
 * @author takeshi
 */
public interface FastMethod {

    /**
     * @return {@link Method}
     */
    Method getMethod();

    /**
     * Se este metodo eh estatico
     * 
     * @return boolean
     */
    boolean isStatic();

    /**
     * Devolve o nome do metodo
     * 
     * @return String
     */
    String getName();

    /**
     * Devolve o numero de argumentos que o metodo representado aceita
     * 
     * @return int
     */
    int getArity();

    /**
     * Devolve o tipo dos argumentos
     * 
     * @return array de {@link Class}
     */
    Class<?>[] getArgumentTypes();

    /**
     * Faz a invocacao do metodo
     * 
     * @param target o alvo do metodo. Pode ser <code>null</code> se o metodo for estatico
     * @param args os argumentos
     * @return {@link Object}
     * @throws Exception excecao original
     */
    Object invoke(Object target, Object... args) throws Exception;

}
